package com.bestv.bsr.core.service.impl.jt.dto;

import com.bestv.bsr.core.service.impl.jt.validate.JTValidGroups;
import lombok.*;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 九天智能推荐请求参数
 *
 * @author taojiacheng
 */
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
@Data
public class JTRequestParam {

    /**
     * 全局唯一 request id，请求方生成( cpid + 随机16位字符串 )
     */
    @NotBlank(groups = {JTValidGroups.TOPIC_DETAIL_VALID.class, JTValidGroups.SIMILAR_VIDEO_VALID.class, JTValidGroups.SEARCH_VALID.class})
    private String id;

    /**
     * 推荐位置类型 【top(头部)， common(指定位置)， all(全部主题)】
     */
    @NotBlank(groups = {JTValidGroups.TOPIC_DETAIL_VALID.class, JTValidGroups.SEARCH_VALID.class})
    private String rectype;

    /**
     * 可以是开户账号
     */
    @NotBlank(groups = {JTValidGroups.TOPIC_DETAIL_VALID.class, JTValidGroups.SIMILAR_VIDEO_VALID.class, JTValidGroups.SEARCH_VALID.class})
    private String userid;

    /**
     * 设备mac 可以为空
     */
    private String sn;

    /**
     * 牌照方或内容提供方唯一标识【平台生成分配】
     */
    @NotBlank(groups = {JTValidGroups.TOPIC_DETAIL_VALID.class, JTValidGroups.SIMILAR_VIDEO_VALID.class, JTValidGroups.SEARCH_VALID.class})
    private String cpid;

    /**
     * 标识请求种类，类比推荐算法标识algoid
     */
    @NotBlank(groups = {JTValidGroups.SIMILAR_VIDEO_VALID.class})
    private String type;

    /**
     * 需要推荐相似媒资的媒资id列表
     */
    @NotNull(groups = {JTValidGroups.SIMILAR_VIDEO_VALID.class})
    private List<String> albumids;

    /**
     * 上下文信息
     */
    @NotNull(groups = {JTValidGroups.TOPIC_DETAIL_VALID.class, JTValidGroups.SIMILAR_VIDEO_VALID.class, JTValidGroups.SEARCH_VALID.class})
    @Valid
    private Context context;

    /**
     * 推荐内容最多个数
     */
    @NotNull(groups = {JTValidGroups.TOPIC_DETAIL_VALID.class, JTValidGroups.SEARCH_VALID.class})
    private Integer numbers;

    /**
     * 服务标识ID【见4.1码表】， rectype=common时可传递多个主题，以逗号分隔。
     */
    @NotBlank(groups = {JTValidGroups.TOPIC_DETAIL_VALID.class, JTValidGroups.SEARCH_VALID.class})
    private String algoid;

    /**
     * 各推荐位位置信息（预留)
     */
    private List<Positions> positions;

    /**
     * 指定访问返回推荐结果中的图片大小（如果需要）
     * 格式为图片长*宽。
     * 如果不传的话，返回结果中只包含默认大小的图片url，
     * 也不会按照图片大小等进行筛选
     */
    private String picsize;


    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    @ToString
    @Data
    public static class Context {

        /**
         * 预留 传1
         */
        @NotBlank(groups = {JTValidGroups.TOPIC_DETAIL_VALID.class, JTValidGroups.SIMILAR_VIDEO_VALID.class, JTValidGroups.SEARCH_VALID.class})
        private String channel;

        /**
         * 填写前后出现的其他媒资，接口进行去重防止重复
         */
        @NotNull(groups = {JTValidGroups.TOPIC_DETAIL_VALID.class, JTValidGroups.SIMILAR_VIDEO_VALID.class, JTValidGroups.SEARCH_VALID.class})
        private List<String> albumid;

        /**
         * 搜索时的关键字
         */
        private String keyword;

    }

    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    @ToString
    @Data
    public static class Positions {

        /**
         * 位置信息，根据前端优先级传参来区分重要性
         */
        @NotBlank(groups = {JTValidGroups.TOPIC_DETAIL_VALID.class})
        private String pos;

        /**
         * 支持的海报类型必填7
         */
        @NotNull(groups = {JTValidGroups.TOPIC_DETAIL_VALID.class})
        private String pictype;

        /**
         * 内容/apk/人物暂不实现所有默认为0
         */
        private Integer posttype;

        /**
         * +节目集id
         */
        private String albumid;

    }


}
